﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Poli.IA.GA
{
    public class Populacao
    {
        public List<Individuo> Individuos { get; set; }
        public List<Musica> MusicasDoBanco { get; set; }

        public Populacao() 
        {
            Individuos = new List<Individuo>();
            MusicasDoBanco = new List<Musica>();
        }

        public void InicializarPopulacao(string caminho) 
        {
            MusicasDoBanco = XMLReader.GetMusicas(caminho);
            for (int i = 0; i < 5; i++)
            {
                Individuo ind = new Individuo();
                ind.InicializarIndividuo(MusicasDoBanco);
                Individuos.Add(ind);

            }
        }

        public void PermutacaoIntraPopulacao(Perfil perfilSelecionado)
        {
            for (int i = 0; i < Individuos.Count; i++)
            {
                Individuo ind = Individuos[i];
                Random r = new Random(DateTime.Now.Millisecond);
                int p = r.Next(100);
                if (p <= 50)
                {
                    int j = 0;
                    do
                    {
                        j = r.Next(Individuos.Count);
                    } while (Individuos[j] == ind);
                    Individuo permut1 = new Individuo();
                    foreach (Musica music in ind.PlayList)
                    {
                        permut1.PlayList.Add(new Musica(music.Nome, music.Artista, music.Estilo, music.Nacionalidade, music.Decada, music.Hit, music.Tendencia, music.Ritmo));
                    }
                    //permut1 = ind;
                    Individuo permut2 = new Individuo();
                    foreach (Musica music in Individuos[j].PlayList)
                    {
                        permut2.PlayList.Add(new Musica(music.Nome, music.Artista, music.Estilo, music.Nacionalidade, music.Decada, music.Hit, music.Tendencia, music.Ritmo));
                    }
                    //permut2 = Individuos[j];
                    int indexMusica = r.Next(permut1.PlayList.Count);
                    Musica musicaPermutar = new Musica(permut2.PlayList[indexMusica].Nome, permut2.PlayList[indexMusica].Artista,
                        permut2.PlayList[indexMusica].Estilo, permut2.PlayList[indexMusica].Nacionalidade, permut2.PlayList[indexMusica].Decada,
                        permut2.PlayList[indexMusica].Hit, permut2.PlayList[indexMusica].Tendencia, permut2.PlayList[indexMusica].Ritmo);
                    //Musica musicaPermutar = permut2.PlayList[indexMusica];
                    Musica paraPermut2 = permut1.PlayList[indexMusica];
                    if ((!ind.PlayList.Exists(m => m.Nome == musicaPermutar.Nome)) && !permut2.PlayList.Exists(m => m.Nome == paraPermut2.Nome))
                    {
                        permut2.PlayList.RemoveAt(indexMusica);
                        permut2.PlayList.Add(permut1.PlayList[indexMusica]);
                        permut1.PlayList.RemoveAt(indexMusica);
                        permut1.PlayList.Add(musicaPermutar);
                        if ((permut1.CalcularFitness(perfilSelecionado) > ind.TestarFitness(perfilSelecionado)))
                        {
                            ind = permut1;
                            //Individuos[j] = permut2;
                        }
                        if (permut2.TestarFitness(perfilSelecionado) > Individuos[j].TestarFitness(perfilSelecionado))
                            Individuos[j] = permut2;

                    }
                }
            }
        }

        public void PermutacaoIndividual(Perfil perfilSelecionado)
        {
            foreach (Individuo individuo in Individuos)
            {
                individuo.Mutacao(MusicasDoBanco, perfilSelecionado);
            }
        }
    }
}
